| Conditions | 3 | 
| Paths | 25 | 
| Total Lines | 56 | 
| Lines | 0 | 
| Ratio | 0 % | 
| Changes | 5 | ||
| Bugs | 1 | Features | 1 | 
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | 'use strict';  | 
            ||
| 10 |     function($scope, $interval, $timeout, savegame, state) { | 
            ||
| 11 | $scope.state = state;  | 
            ||
| 12 | |||
| 13 | let self = this;  | 
            ||
| 14 | let playerCopy = null;  | 
            ||
| 15 | |||
| 16 | /**  | 
            ||
| 17 | * Polyfill for Object.values from the TS39 Proposal. Reflect.ownKeys  | 
            ||
| 18 | * swapped out for an equivalent using Object instead. Placing it here so  | 
            ||
| 19 | * it'll fire before it's needed in ct_matter, and at the top of this  | 
            ||
| 20 | * controller so it'll only fire once.  | 
            ||
| 21 | *  | 
            ||
| 22 | * Polyfill: https://github.com/tc39/proposal-object-values-entries  | 
            ||
| 23 | * Reflect.ownKeys Alternative:  | 
            ||
| 24 | * https://stackoverflow.com/questions/34449045/what-is-the-difference-between-reflect-ownkeysobj-and-object-keysobj  | 
            ||
| 25 | */  | 
            ||
| 26 | const reduce = Function.bind.call(Function.call, Array.prototype.reduce);  | 
            ||
| 27 | const isEnumerable = Function.bind.call(Function.call, Object.prototype.propertyIsEnumerable);  | 
            ||
| 28 | const concat = Function.bind.call(Function.call, Array.prototype.concat);  | 
            ||
| 29 | const keys = (target) => Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));  | 
            ||
| 30 | // const keys = Reflect.ownKeys;  | 
            ||
| 31 | |||
| 32 |       if (!Object.values) { | 
            ||
| 33 |         Object.values = function values(O) { | 
            ||
| 
                                                                                                    
                        
                         | 
                |||
| 34 | return reduce(keys(O), (v, k) => concat(v, typeof k === 'string' && isEnumerable(O, k) ? [O[k]] : []), []);  | 
            ||
| 35 | };  | 
            ||
| 36 | }  | 
            ||
| 37 | |||
| 38 |       if (!Object.entries) { | 
            ||
| 39 |         Object.entries = function entries(O) { | 
            ||
| 40 | return reduce(keys(O), (e, k) => concat(e, typeof k === 'string' && isEnumerable(O, k) ? [[k, O[k]]] : []), []);  | 
            ||
| 41 | };  | 
            ||
| 42 | }  | 
            ||
| 43 | /** End Polyfill */  | 
            ||
| 44 | |||
| 45 |       self.update = function() { | 
            ||
| 46 | // do the update in a copy  | 
            ||
| 47 | playerCopy = angular.copy(state.player);  | 
            ||
| 48 | |||
| 49 | state.update(playerCopy);  | 
            ||
| 50 | |||
| 51 | // and update all at once  | 
            ||
| 52 | state.player = playerCopy;  | 
            ||
| 53 | |||
| 54 | $timeout(self.update, 1000);  | 
            ||
| 55 | };  | 
            ||
| 56 | |||
| 57 |       self.startup = function() { | 
            ||
| 58 | savegame.load();  | 
            ||
| 59 | state.loading = false;  | 
            ||
| 60 | $timeout(self.update, 1000);  | 
            ||
| 61 | $interval(savegame.save, 10000);  | 
            ||
| 62 | };  | 
            ||
| 63 | |||
| 64 | $timeout(self.startup);  | 
            ||
| 65 | }  | 
            ||
| 66 | ]);  | 
            ||
| 67 |